package com.ceair.kafka.producer;

import com.ceair.entity.dto.SysLogDto;
import com.ceair.util.KafkaUtils;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Service;

/**
 * @author wangbaohai
 * @ClassName SysLogProducer
 * @description: 系统操作日志生产者
 * @date 2025年04月17日
 * @version: 1.0.0
 */
@Slf4j
@Component
public class SysLogProducer {

    @Value("${syslog.kafka.topic}")
    private String logTopic;

    private final ObjectMapper objectMapper;
    private final KafkaUtils kafkaUtils;

    public SysLogProducer(ObjectMapper objectMapper, KafkaUtils kafkaUtils) {
        this.objectMapper = objectMapper;
        this.kafkaUtils = kafkaUtils;
        // 注册 JavaTimeModule 支持 LocalDate 和 LocalDateTime 序列化
        this.objectMapper.registerModule(new JavaTimeModule());
    }

    /**
     * 发送系统日志到Kafka队列
     *
     * 该方法负责将系统日志对象（SysLogDto）转换为JSON字符串，并发送到指定的Kafka主题中
     * 主要步骤包括：
     * 1. 序列化SysLogDto对象为JSON字符串
     * 2. 使用KafkaUtils类发送JSON字符串到Kafka队列
     *
     * @param sysLogDto 系统日志对象，包含日志的相关信息
     */
    public void sendSysLog(SysLogDto sysLogDto) {
        try {
            // 将SysLog对象序列化为JSON字符串
            String logJson = objectMapper.writeValueAsString(sysLogDto);

            // 使用KafkaUtils发送消息
            kafkaUtils.sendKafkaMessage(logTopic, logJson);
        } catch (JsonProcessingException e) {
            // 处理序列化异常
            log.error("Failed to serialize SysLogDto to JSON: {}", e.getMessage());
            // TODO:这种错误由于还没有到发mq的环节就错了，所以需要持久化补偿，方案待定
        }catch (Exception e) {
            // 处理发送消息到Kafka时的其他异常
            log.error("Failed to send SysLogDto to Kafka: {}", e.getMessage());
        }
    }
}
